﻿using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace Tiscs.Practices.Web.Providers.Entities
{
    /// <summary>
    /// 成员资格实体。
    /// </summary>
    public class MembershipEntity
    {
        /// <summary>
        /// 密码最大长度。
        /// </summary>
        public const int PasswordMaxLength = 128;

        /// <summary>
        /// 加密Salt最大长度。
        /// </summary>
        public const int PasswordSaltMaxLength = 128;

        /// <summary>
        /// 电子邮件最大长度。
        /// </summary>
        public const int EmailMaxLength = 256;

        /// <summary>
        /// 安全问题最大长度。
        /// </summary>
        public const int PasswordQuestionMaxLength = 256;

        /// <summary>
        /// 安全答案最大长度。
        /// </summary>
        public const int PasswordAnswerMaxLength = 128;

        /// <summary>
        /// 用户描述最大长度。
        /// </summary>
        public const int CommentMaxLength = 256;

        /// <summary>
        /// 用户唯一标识。
        /// </summary>
        [Key]
        public Guid UserId { get; set; }

        /// <summary>
        /// 应用程序唯一标识。
        /// </summary>
        [Index("IX_ApplicationId_Email", IsUnique = true, Order = 1)]
        public Guid ApplicationId { get; set; }

        /// <summary>
        /// 登录密码。
        /// </summary>
        [Required]
        [StringLength(PasswordMaxLength)]
        public string Password { get; set; }

        /// <summary>
        /// 密码加密方式。
        /// </summary>
        public int PasswordFormat { get; set; }

        /// <summary>
        /// 加密Salt。
        /// </summary>
        [Required]
        [StringLength(PasswordSaltMaxLength)]
        public string PasswordSalt { get; set; }

        /// <summary>
        /// 电子邮件。
        /// </summary>
        [Index("IX_ApplicationId_Email", IsUnique = true, Order = 2)]
        [StringLength(EmailMaxLength)]
        public string Email { get; set; }

        /// <summary>
        /// 安全问题。
        /// </summary>
        [StringLength(PasswordQuestionMaxLength)]
        public string PasswordQuestion { get; set; }

        /// <summary>
        /// 安全答案。
        /// </summary>
        [StringLength(PasswordAnswerMaxLength)]
        public string PasswordAnswer { get; set; }

        /// <summary>
        /// 是否有效。
        /// </summary>
        public bool IsApproved { get; set; }

        /// <summary>
        /// 是否已锁定。
        /// </summary>
        public bool IsLockedOut { get; set; }

        /// <summary>
        /// 创建日期。
        /// </summary>
        public DateTime CreateDate { get; set; }

        /// <summary>
        /// 最后登录日期。
        /// </summary>
        public DateTime LastLoginDate { get; set; }

        /// <summary>
        /// 最后修改密码日期。
        /// </summary>
        public DateTime LastPasswordChangedDate { get; set; }

        /// <summary>
        /// 最后锁定日期。
        /// </summary>
        public DateTime LastLockoutDate { get; set; }

        /// <summary>
        /// 错误登录密码尝试次数。
        /// </summary>
        public int FailedPasswordAttemptCount { get; set; }

        /// <summary>
        /// 错误登录密码尝试时间。
        /// </summary>
        public DateTime FailedPasswordAttemptWindowStart { get; set; }

        /// <summary>
        /// 错误安全问题尝试次数。
        /// </summary>
        public int FailedPasswordAnswerAttemptCount { get; set; }

        /// <summary>
        /// 错误安全问题尝试时间。
        /// </summary>
        public DateTime FailedPasswordAnswerAttemptWindowsStart { get; set; }

        /// <summary>
        /// 用户描述。
        /// </summary>
        [StringLength(CommentMaxLength)]
        public string Comment { get; set; }

        /// <summary>
        /// 当前成员所在的应用程序。
        /// </summary>
        public virtual ApplicationEntity Application { get; set; }

        /// <summary>
        /// 当前成员资格对应的用户。
        /// </summary>
        public virtual UserEntity User { get; set; }
    }
}
